package com.glowdayz.common;

import java.io.File;
import java.util.Calendar;
import java.util.Locale;

import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Environment;
import android.provider.MediaStore;

public class ImageHelper {
	private static ImageHelper current = null;

	public static ImageHelper getInstance() {
		if (current == null) {
			current = new ImageHelper();
		}

		return current;
	}

	/**
	 * 갤러리에서 선택한 이미지의 Uri를 실제 물리적 경로로 변환한다.
	 * @param context
	 * @param uri
	 * @return
	 */
	public String getFilePathFromUri(Context context, Uri uri) {
		Cursor c = context.getContentResolver().query(uri, null, null, null, null);
		c.moveToNext();
		String path = c.getString(c
				.getColumnIndex(MediaStore.MediaColumns.DATA));
		return path;
	}

	/**
	 * 이미지 경로에 대한 썸네일을 생성하여 이미지 바이너리를 리턴한다.
	 * @param path
	 * @return String
	 */
	public Bitmap getThumb(String path, int maxScale) {
		// 비트맵 이미지의 옵션 받을 변수 생성
		BitmapFactory.Options options = new BitmapFactory.Options();
		
		// 비트맴을 바로 로드하지 말고 옵션만 받아오라고 설정
		options.inJustDecodeBounds = true;
		// 매트맵을 읽는데 윗줄에 의해 옵션만 받아오고 비트맵을 다 읽지는 않음
		BitmapFactory.decodeFile(path, options);  

		// / 이미지의 높이를 얻음
		int fscale = options.outHeight;
		
		// 이미지의 높이보다 넓이가 클 경우
		if (options.outWidth > options.outHeight)
		{
			// 이미지의 넓이를 스케일에 저장
			fscale = options.outWidth;
		}

		// 실제 이미지를 저장할 변수
		Bitmap bmp = null;

		// / 이미지의 넓이가 maxScale보다 크면
		if (maxScale < fscale) {
			// / 이미지의 사이즈를 maxScale으로 나눈 만큼 리사이징 할거다
			fscale = fscale / maxScale;
			// / 새 비트맵 옵션 생성
			BitmapFactory.Options options2 = new BitmapFactory.Options();
			// 리사이징할 비율 설정
			options2.inSampleSize = fscale;
			// 실제로 비트맵을 읽어온다.
			bmp = BitmapFactory.decodeFile(path, options2);
		} else { // / 사이즈가 적당 하면 그냥 읽는다.
			bmp = BitmapFactory.decodeFile(path);
		}

		return bmp;
	}
	
	/**
	 * 사진이 저장될 경로를 생성하여 리턴한다.
	 * @return String
	 */
	public String getNewPhotoPath() {
		// 현재 날짜를 기준으로 파일이름 생성
		Calendar c = Calendar.getInstance();
		int yy = c.get(Calendar.YEAR);
		int mm = c.get(Calendar.MONTH) + 1;
		int dd = c.get(Calendar.DAY_OF_MONTH);
		int hh = c.get(Calendar.HOUR_OF_DAY);
		int mi = c.get(Calendar.MINUTE);
		int ss = c.get(Calendar.SECOND);

		String file_name = String.format(Locale.getDefault(),
				"%04d-%02d-%02d %02d;%02d;%02d.jpg", yy, mm,
				dd, hh, mi, ss);		
		
		// 사진이 저장되는 시스템 디렉토리 경로 얻기
		String camera_dir = Environment
				.getExternalStoragePublicDirectory(
						Environment.DIRECTORY_DCIM).getAbsolutePath();

		// 디렉토리가 없다면 생성
		File dir = new File(camera_dir);
		if (!dir.exists()) {
			dir.mkdirs();
		}

		// 디렉토리 경로 + 파일 경로 형태로 파일 객체 생성
		File photo = new File(camera_dir, file_name);
		
		// 파일 객체의 절대 경로 생성
		return photo.getAbsolutePath();
	}
	
	/**
	 * 경로상의 사진을 갤러리에 등록한다.
	 * @return String
	 */
	public void addGallery(Context context, String path) {
		// 촬영한 이미지를 갤러리에 등록한다.
		Intent photo_intent = new Intent(
				Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,
				Uri.parse("file://" + path));
		context.sendBroadcast(photo_intent);
	}
}


